package educar.controllers;

import java.awt.event.ActionEvent;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.sql.ResultSet;
import educar.db.JPA;
import educar.gui.DocenteView;
import educar.models.Actividad;
import educar.models.Alumno;
import educar.models.Materia;
import educar.models.Session;
import educar.models.userNotFound;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;

public class TransaccionDocenteController implements ActionListener{
  private static JPA jpa = new JPA();
  private DocenteView view;
  String codigoMateria;
  String codigoActividad;
  String codigoAlumno;
  String descripcionActividad;
	
  public TransaccionDocenteController(DocenteView view){
    this.view = view; 
  }
	
  public void actionPerformed(ActionEvent evento){
	codigoMateria = "";
	codigoActividad = "";
	codigoAlumno="";
	descripcionActividad="";
	if(evento.getActionCommand().equals("Cargar Actividad")){
	  descripcionActividad=view.getDescripcionActividad();
	  codigoMateria=view.getCodigoMateriaDeCargarActividad();
	  if(codigoMateria!="**MATERIAS**") {
		Actividad nueva=new Actividad(descripcionActividad,Integer.parseInt(codigoMateria));
		nueva.save();
		JOptionPane.showMessageDialog(null, "Actividad cargada con exito");
		view.refrescarCampos();
	  }
	  else {
	    JOptionPane.showMessageDialog(null, "No selecciono materia");
	  }
	}
	else {
      if(evento.getActionCommand().equals("Eliminar Actividad")){
	    codigoMateria=view.getCodigoMateriaDeEliminarActividad();
		codigoActividad=view.getCodigoActividadDeEliminarActividad();
		if((codigoActividad.equals("**ACTIVIDADES**"))||(codigoMateria.equals("**MATERIAS"))) {
		  JOptionPane.showMessageDialog(null, "Error en los datos");
		}
		else{
		  Actividad nueva=Actividad.getActividadByCodigo(codigoActividad);
		  if(nueva!=null){
		    nueva.destroy();
			JOptionPane.showMessageDialog(null, "Actividad eliminada con exito");
			view.refrescarCampos();
		  } 
		  else {
		    JOptionPane.showMessageDialog(null, "Esa actividad ya fue eliminada");
		  }	
	    }
	  } 
      else {
		if(evento.getActionCommand().equals("Buscar Actividades")){
		  try{
			codigoMateria=view.getCodigoMateriaDeEliminarActividad();
			view.actualizarActividadesEnEliminarActividad(this.listarActividadesPorMateria(codigoMateria));
		  } 
		  catch (SQLException e) {e.printStackTrace();}
		  } 
		else {
		  if(evento.getActionCommand().equals("Enter")){
		  try{
		    codigoMateria=view.getCodigoMateriaDeResolucion();
	        System.out.println("codigoMateria "+codigoMateria);
		    view.actualizarAlumnos(this.listarAlumnosPorMateria(codigoMateria));
			view.actualizarActividadesEnResolucion(this.listarActividadesPorMateria(codigoMateria));
		  } 
		  catch (SQLException e) {e.printStackTrace();}
		  }
		  else{
		    if(evento.getActionCommand().equals("Listo")){
			  codigoActividad=view.getCodigoActividadesEnResolucion();
			  codigoMateria=view.getCodigoMateriaDeResolucion();
			  codigoAlumno=view.getDniAlumnoDeResolucion();
			  if((codigoActividad.equals("**ACTIVIDADES**"))||(codigoMateria.equals("**MATERIAS**"))||(codigoAlumno.equals("**ALUMNOS**"))){
			    JOptionPane.showMessageDialog(null, "Error en los datos");
			  } 
			  else {
				boolean realizoActividad = false;
				ResultSet rs = jpa.getByField("realiza","dni_alumno",codigoAlumno);
				try {
				  while(rs.next()){
				   if(codigoActividad.equals(Integer.toString(rs.getInt(2)))){
					  realizoActividad = true;
				   }
				}
				if (realizoActividad) {
				  String[] columns = {"codigo","dni_docente","nota","dni_alumno","cod_act"};
				  PreparedStatement stm = jpa.newRecord("educar_dev.resolucion", columns);
				  int codigo = Integer.parseInt(codigoAlumno)+Integer.parseInt(codigoActividad);
				  int dniDocente = Session.getCurrentUser().getCode();
				  int nota = view.getNotaAlumno();
				  int dniAlumno = Integer.parseInt(codigoAlumno);
				  int codActividad = Integer.parseInt(codigoActividad);
				  if (nota == -1){
				    JOptionPane.showMessageDialog(null,"No asigno nota valida al alumno");
				  }
				  else {
				    stm.setInt(1,codigo);
					stm.setInt(2,dniDocente);
					stm.setInt(3,nota);
					stm.setInt(4,dniAlumno);
					stm.setInt(5,codActividad);
					stm.executeUpdate();
					JOptionPane.showMessageDialog(null, "Actividad corregida exitosamente");
				  }
				} 
				else {
				  JOptionPane.showMessageDialog(null, "El alumno elegido no realizo esa actividad");
				}
			} 
		    catch(SQLException e){
			  JOptionPane.showMessageDialog(null,"Ya corrigio la actividad a ese alumno");
			}
		   }
		  }
		 }
       }
     }
    }
  }
			
						
  public String[] listarMateriasPorDocente() throws SQLException{ 
    ArrayList<String> materias = Materia.getMateriasPorDocente();
    String [] res = new String[materias.size()+1];
    res[0] = "**MATERIAS**";
    for(int i=1; i<(materias.size()+1); i++){
	  res [i] = materias.get(i-1);  
	}
	return res;
  }
	
  public String codActividad(String linea){
    String res = "";
	int i = 1;
	while(linea.charAt(i)!=')'){
	  res = res + linea.charAt(i); 
	}
	return res;
  }
	
  public String[] listarActividadesPorMateria(String codigoMateria) throws SQLException {
    ArrayList<String> actividades = Actividad.getActividadesPorMateria(codigoMateria);
    String [] res = new String[actividades.size()+1];
    res[0] = "**ACTIVIDADES**";
    for(int i=1; i<(actividades.size()+1); i++){
	  res [i] = actividades.get(i-1);  
	}
	return res;	
  }
		
  public String[] listarAlumnosPorMateria(String codigoMateria) throws SQLException {
    ArrayList<Integer> alumnos = Materia.getAlumnosPorMateria(codigoMateria);
    String [] res = new String[alumnos.size()+1];
    res[0] = "**ALUMNOS**";
    for(int i=1; i<(alumnos.size()+1); i++){
	  String dni = Integer.toString(alumnos.get(i-1));
	  try{
	     Alumno a = Alumno.getAlumnoByDNI(dni);
		 res [i] = "(" + dni + ")  " + a.getNombre() + " " + a.getApellido();
	  } 
	  catch(userNotFound e) {}	
	  }
	  return res;	
  }
}